package com.otv.model;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;



/**
 * Class Alojamiento.
 */
@Entity
@Table(name="re_alojamiento")

public class Alojamiento {
	
	/** El/la id. */
	@Id
	@Column(name="al_id_alojamiento", unique=true, nullable=false)
	private int id;
	
	/** El/la tipo alojamiento. */
	@ManyToOne (fetch = FetchType.EAGER)
	@JoinColumn (name="ta_id_tipo_alojamiento", nullable = true)
	private TipoAlojamiento tipoAlojamiento;
	
	/** El/la encargado. */
	@ManyToOne (fetch = FetchType.EAGER)
	@JoinColumn (name="en_id_encargado", nullable = true)
	private Encargado encargado;
	
	/** El/la nombre. */
	@Column(name="al_nombre", unique=false, nullable=false)
	private String nombre;
	
	/** El/la direccion. */
	@Column(name="al_direccion", unique=false, nullable=false)
	private String direccion;
	
	/** El/la disponible. */
	@Column(name="al_diponible", unique=false, nullable=false)
	private boolean disponible;
	
	/** El/la valor. */
	@Column(name="al_valor", unique=false, nullable=true)
	private Double valor;
	
	/** El/la arriendos. */
	@OneToMany (fetch = FetchType.LAZY, mappedBy="alojamiento")
	private List<Arriendo> arriendos;
	
	/** El/la piezas. */
	@OneToMany (fetch = FetchType.LAZY, mappedBy="alojamiento")
	private List<Pieza> piezas;

	
	/** El/la privilegios. */
	@ManyToMany(cascade = {CascadeType.ALL})	
	@JoinTable(name="re_alojamiento_privilegio", joinColumns={@JoinColumn(name="al_id_alojamiento")},
	inverseJoinColumns={@JoinColumn(name="pr_id_privilegio")})
	List<Privilegio> privilegios;
	
	/** El/la Servicios. */
	@ManyToMany(cascade = {CascadeType.ALL})
	@JoinTable(name="re_alojamiento_servicio", joinColumns={@JoinColumn(name="al_id_alojamiento")},
	inverseJoinColumns={@JoinColumn(name="se_id_servicio")})
	List<Servicio> servicios;

	
	
	
	/**
	 * Devuelve un(a) id.
	 *
	 * @return El/la id
	 */
	public int getId() {
		return id;
	}

	/**
	 * Asigna el/la id.
	 *
	 * @param id un(a) nuevo(a) id
	 */
	public void setId(int id) {
		this.id = id;
	}

	/**
	 * Devuelve un(a) tipo alojamiento.
	 *
	 * @return El/la tipo alojamiento
	 */
	public TipoAlojamiento getTipoAlojamiento() {
		return tipoAlojamiento;
	}

	/**
	 * Asigna el/la tipo alojamiento.
	 *
	 * @param tipoAlojamiento un(a) nuevo(a) tipo alojamiento
	 */
	public void setTipoAlojamiento(TipoAlojamiento tipoAlojamiento) {
		this.tipoAlojamiento = tipoAlojamiento;
	}

	/**
	 * Devuelve un(a) encargado.
	 *
	 * @return El/la encargado
	 */
	public Encargado getEncargado() {
		return encargado;
	}

	/**
	 * Asigna el/la encargado.
	 *
	 * @param encargado un(a) nuevo(a) encargado
	 */
	public void setEncargado(Encargado encargado) {
		this.encargado = encargado;
	}

	/**
	 * Devuelve un(a) nombre.
	 *
	 * @return El/la nombre
	 */
	public String getNombre() {
		return nombre;
	}

	/**
	 * Asigna el/la nombre.
	 *
	 * @param nombre un(a) nuevo(a) nombre
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	/**
	 * Devuelve un(a) direccion.
	 *
	 * @return El/la direccion
	 */
	public String getDireccion() {
		return direccion;
	}

	/**
	 * Asigna el/la direccion.
	 *
	 * @param direccion un(a) nuevo(a) direccion
	 */
	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}

	/**
	 * Comprueba si es disponible.
	 *
	 * @return true, si es disponible
	 */
	public boolean isDisponible() {
		return disponible;
	}

	/**
	 * Asigna el/la disponible.
	 *
	 * @param disponible un(a) nuevo(a) disponible
	 */
	public void setDisponible(boolean disponible) {
		this.disponible = disponible;
	}

	/**
	 * Devuelve un(a) valor.
	 *
	 * @return El/la valor
	 */
	public Double getValor() {
		return valor;
	}

	/**
	 * Asigna el/la valor.
	 *
	 * @param valor un(a) nuevo(a) valor
	 */
	public void setValor(Double valor) {
		this.valor = valor;
	}

	/**
	 * Devuelve un(a) arriendos.
	 *
	 * @return El/la arriendos
	 */
	public List<Arriendo> getArriendos() {
		return arriendos;
	}

	/**
	 * Asigna el/la arriendos.
	 *
	 * @param arriendos un(a) nuevo(a) arriendos
	 */
	public void setArriendos(List<Arriendo> arriendos) {
		this.arriendos = arriendos;
	}

	/**
	 * Devuelve un(a) piezas.
	 *
	 * @return El/la piezas
	 */
	public List<Pieza> getPiezas() {
		return piezas;
	}

	/**
	 * Asigna el/la piezas.
	 *
	 * @param piezas un(a) nuevo(a) piezas
	 */
	public void setPiezas(List<Pieza> piezas) {
		this.piezas = piezas;
	}

	/**
	 * Devuelve un(a) privilegios.
	 *
	 * @return El/la privilegios
	 */
	public List<Privilegio> getPrivilegios() {
		return privilegios;
	}

	/**
	 * Asigna el/la privilegios.
	 *
	 * @param privilegios un(a) nuevo(a) privilegios
	 */
	public void setPrivilegios(List<Privilegio> privilegios) {
		this.privilegios = privilegios;
	}

	public List<Servicio> getServicios() {
		return servicios;
	}

	public void setServicios(List<Servicio> servicios) {
		this.servicios = servicios;
	}


}
